﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FlyWeigth
{
    class FlyWeigth
    {

        /*
         *个人理解  享元模式  不就是对象池模式么
         * 搞得那么高大上
         *
         * .net中的池技术，有很多，比如  数据库连接池、字符串池等
         *
         *这个池技术  我觉得主要是为了提高系统性能。比如啊，我软件中经常要用 "程序狗"这个
         * 字符串，OK，我每次用的时候取堆内存开一块，然后存进去"程序狗"，，，每次用每次开
         *  这是不是有点出现  重复代码的意思啊。。。好吧，封装一下。。。
         * 怎么封装呢？？？这样  我建个房子，用的时候拉出来用，用完之后，我再给他放回到房子里取  这样下次取
         * 我也不用重新newl,也不用满内存取找空地址放他了。。。
         *
         *
         * 官方解释：在软件系统中，采用纯粹的对象方法，会产生问题:大量的细粒度的对象充斥
         * 再系统中从而带来较大的运行代价=》占内存。为了解决这个问题，我们想办法找一些共
         * 享的方法，用共享的技术有效地支持大量细粒度的对象。比如数据库连接池、字符串池、
         * 字体池。。。。
         *
         *
         * 举例   Person类型
         *
         *
         *
         * 写完之后，我觉得这个享元技术  有点像  那个   缓存。。   赶明再加个   超时清理
         */
        private static Dictionary<string, Person> _dicPerson = new Dictionary<string, Person>();
        /// <summary>
        /// 这个方法  线程不安全
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public Person GetPerson(string name)
        {
            if (!_dicPerson.ContainsKey(name))
            {
                _dicPerson.Add(name, new Person() { Name = name });
            }
            return _dicPerson[name];
        }
        /// <summary>
        /// 线程不安全怎么办。。。。。单例模式  双if + 锁 
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public Person GetPersonSafe(string name)
        {
            if (!_dicPerson.ContainsKey(name))
            {
                lock (this)
                {
                    if (!_dicPerson.ContainsKey(name))
                    {
                        _dicPerson.Add(name, new Person() { Name = name });
                    }
                }
            }
            return _dicPerson[name];
        }
    }

    public class Person
    {
        public string Name { get; set; }
    }
}
